{
  "nbformat": 4,
  "nbformat_minor": 0,
  "metadata": {
    "kernelspec": {
      "display_name": "Python 3",
      "language": "python",
      "name": "python3"
    },
    "language_info": {
      "codemirror_mode": {
        "name": "ipython",
        "version": 3
      },
      "file_extension": ".py",
      "mimetype": "text/x-python",
      "name": "python",
      "nbconvert_exporter": "python",
      "pygments_lexer": "ipython3",
      "version": "3.7.5"
    },
    "colab": {
      "name": "Part 01 - The Basic Tools of Private Deep Learning.ipynb",
      "provenance": [],
      "collapsed_sections": []
    }
  },
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "cgAP3DDqj6Td",
        "colab_type": "text"
      },
      "source": [
        "# টিউটোরিয়ালঃ প্রাইভেট ডিপ লার্নিং-এর প্রাথমিক সরঞ্জামসমূহ\n",
        "\n",
        "গোপনীয়তা সংরক্ষণ ও বিকেন্দ্রীকরণ ডিপ লার্নিং নিয়ে PySyft এর প্রাথমিক টিউটোরিয়ালে স্বাগতম। এই সিরিজের নোটবুকগুলো আপনার জন্য এক ধরনের ধাপে ধাপে ভাগ করা নির্দেশিকা, যেখানে আপনি শিখবেন - একটি কর্তৃপক্ষের অধীনে কেন্দ্রীভূত না করে গোপন/ব্যক্তিগত তথ্য/মডেলগুলিতে ডিপ লার্নিং প্রয়োগের জন্য প্রয়োজনীয় নতুন সরঞ্জামসমূহ এবং প্রযুক্তিসমূহ।\n",
        "\n",
        "**ব্যাপ্তি:** মনে রাখবেন যে আমরা কীভাবে ডেটা বিকেন্দ্রীকরণ / এনক্রিপ্ট করব শুধু সে সম্পর্কে কথা বলব না, তার সাথে আমরা কীভাবে PySyft-কে ব্যবহার করে পুরো ইকোসিস্টেমকে বিকেন্দ্রীকরণে সহায়তা করতে পারি যেখানে ডেটা সংরক্ষণ এবং কোয়েরি করা ডেটাবেসও থাকবে তা সম্বোধন করব। আরো সম্বোধন করবো সে সব নিউরাল মডেলগুলি যা ডেটা থেকে তথ্য আহরণের জন্য ব্যবহৃত হয়। PySyft-এ নতুন এক্সটেনশন তৈরি হওয়ার সাথে সাথে এই নোটবুকগুলি নতুন কার্যকারিতা ব্যাখ্যা করার জন্য নতুন টিউটোরিয়ালগুলির সাথে প্রসারিত হবে।\n",
        "## লেখক:\n",
        "- Andrew Trask - Twitter: [@iamtrask](https://twitter.com/iamtrask)\n",
        "\n",
        "## অনুবাদক:\n",
        "- Sayantan Das - Github: [@ucalyptus](https://github.com/ucalyptus)\n",
        "\n",
        "- Mir Mohammad Jaber - Twitter: [@jabertuhin](https://twitter.com/jabertuhin)\n",
        "\n",
        "## রূপরেখা:\n",
        "\n",
        "- পর্ব ১ঃ প্রাইভেট ডিপ লার্নিং-এর প্রাথমিক সরঞ্জামসমূহ\n",
        "\n",
        "## কেন এই টিউটোরিয়াল গ্রহণ করবেন?\n",
        "\n",
        "**১) একটি প্রতিযোগিতামূলক ক্যারিয়ার সুবিধা** - গত ২০ বছর ধরে, ডিজিটাল বিপ্লবের ফলে এনালগ প্রক্রিয়াগুলি ডিজিটাইজড হয়ে যাচ্ছে। যার কারণে প্রচুর পরিমাণে ডেটা আরও বেশি পরিমাণে সহজলোভ্য হয়ে গিয়েছে। যাইহোক, নতুন বিধান যেমন-[GDPR](https://eugdpr.org/) এর কারণে এন্টারপ্রাইজগুলি তথ্যের অবাধ ব্যবহার করতে না পারায় এবং আরো গুরুত্বপূর্ণ হচ্ছে সেগুলো বিশ্লেষণ করার স্বাধীনতা কমে যাওয়ায় তারা চাপে পড়ে গিয়েছে। **পরিশেষে:** তথ্য বিজ্ঞানীরা পুরাতন সরঞ্জামের সাহায্যে আগের মতো ততো বেশি ডেটা ব্যবহারে অনুমতি পাবেন না। তবে প্রাইভেট ডিপ লার্নিংয়ের সরঞ্জামগুলি শিখে আপনি এই কার্ভের(curve) চেয়ে এগিয়ে থাকতে পারেন এবং এতে প্রতিযোগিতামূলক সুবিধা পেতে পারেন আপনার কর্মজীবনে।\n",
        "\n",
        "**2) উদ্যোক্তা সুযোগ** - সমাজে পুরো সমস্যা রয়েছে যা ডিপ লার্নিং সমাধান করতে পারে তবে বেশিরভাগ গুরুত্বপূর্ণ অনুসন্ধান করা হয়নি কারণ এর জন্য মানুষের সম্পর্কে অবিশ্বাস্য সংবেদনশীল তথ্য অ্যাক্সেসের প্রয়োজন হবে (মানসিক বা সম্পর্কের সমস্যাযুক্ত ব্যক্তিদের সহায়তা করার জন্য ডিপ লার্নিংয়ের ব্যবহার বিবেচনা করুন) !)। সুতরাং, প্রাইভেট ডিপ লার্নিং শেখা আপনার জন্য নতুন স্টার্টাপ(startup) শুরু করার সুযোগগুলি পুরোপুরি উন্মুক্ত করে যা এই সরঞ্জামগুলি ছাড়া অন্যদের কাছে আগে সহজলভ্য ছিল না।\n",
        "\n",
        "**3) সামাজিক ভাল** - ডিপ লার্নিং বাস্তব বিশ্বের বিভিন্ন ধরণের সমস্যা সমাধানের জন্য ব্যবহার করা যেতে পারে, তবে * ব্যক্তিগত তথ্য * সম্পর্কে ডিপ লার্নিং হল মানুষের সম্পর্কে *, মানুষের জন্য * গভীর শেখা। আপনার নিজের মতো নয় এমন ডেটাতে কীভাবে ডিপ লার্নিং করবেন তা শেখা ক্যারিয়ার বা উদ্যোক্তা সুযোগের চেয়ে বেশি প্রতিনিধিত্ব করে, এটি মানুষের জীবনের সবচেয়ে ব্যক্তিগত এবং গুরুত্বপূর্ণ কিছু সমস্যা সমাধানে সহায়তা করার সুযোগ - এবং এটি স্কেল করে করার জন্য।\n",
        "\n",
        "## আমি কীভাবে অতিরিক্ত credit পেতে পারি?\n",
        "\n",
        "- গিটহাবে PySyft-কে স্টার দিন !- [https://github.com/OpenMined/PySyft](https://github.com/OpenMined/PySyft)\n",
        "\n",
        "- এই নোটবুকটি শিখিয়ে একটি ইউটিউব ভিডিও তৈরি করুন!\n",
        "\n",
        "\n",
        "... ঠিক আছে, তবে কাজ শুরু করা যাক!"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "loobd6soj6Tg",
        "colab_type": "text"
      },
      "source": [
        "# পার্ট -১: পূর্বশর্তসমূহ \n",
        "\n",
        "- পাইটর্চ জানেন - তা না হলে [fast.ai](http://fast.ai) কোর্সটি নিয়ে পরবর্তীতে ফিরে আসুন\n",
        "\n",
        "- PySyft ফ্রেমওয়ার্কের পেপারটি(https://arxiv.org/pdf/1811.04017.pdf) পড়ুন! এটি আপনাকে PySyft কীভাবে নির্মাণ করা হয়েছে তার সামগ্রিক ব্যাকগ্রাউন্ড দেবে, যা জিনিসগুলি আরও অর্থবোধ করতে সহায়তা করবে।"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "1zCFktYMj6Ti",
        "colab_type": "text"
      },
      "source": [
        "# পার্ট ০: সেটাপ(Setup)\n",
        "শুরু করার জন্য আপনাকে সঠিক জিনিসগুলি ইনস্টল করা আছে কি-না তা নিশ্চিত করতে হবে। এটি করার জন্য, পাইসাইফ্টের(Pysyft) README-তে যান এবং সেটাপ করার নির্দেশাবলী অনুসরণ করুন। বেশিরভাগ লোকের জন্য সংক্ষেপে হলো - \n",
        "\n",
        "- Install Python 3.6 or higher\n",
        "- Install PyTorch 1.4\n",
        "- pip install syft[udacity]\n",
        "\n",
        "যদি এর কোনও অংশ আপনার জন্য কাজ না করে(বা টেস্টগুলির কোনওটি ব্যর্থ হয়) - ইনস্টলেশন সহায়তার জন্য প্রথমে [README](https://github.com/OpenMined/PySyft.git) দেখুন এবং তারপরে একটি গিটহাব ইস্যু খুলুন বা আমাদের স্ল্যাকে #beginner চ্যানেলটিতে ping করুন! [Slack.openmined.org](http://slack.openmined.org/)"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "bVIvuJgNj6Tj",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "# Run this cell to see if things work\n",
        "import sys\n",
        "\n",
        "import torch\n",
        "from torch.nn import Parameter\n",
        "import torch.nn as nn\n",
        "import torch.nn.functional as F\n",
        "\n",
        "import syft as sy\n",
        "hook = sy.TorchHook(torch)\n",
        "\n",
        "torch.tensor([1,2,3,4,5])"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "AkPW0-U2j6Ts",
        "colab_type": "text"
      },
      "source": [
        "যদি এই সেলটি কার্যকরী হয়, তবে আপনি তৈরি! তবে শুরু করা যাক!"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "_hWcMvEZj6Tt",
        "colab_type": "text"
      },
      "source": [
        "# পার্ট ১: ব্যক্তিগত(Private), বিকেন্দ্রীভূত ডাটা সায়েন্সের প্রাথমিক সরঞ্জামসমূহ\n",
        "\n",
        "সুতরাং, আপনি যে প্রশ্নটি প্রথম থেকেই ভাবতে পারেন তা হলো - আমরা কোনও মডেলকে কীভাবে এমন ডেটার উপর প্রশিক্ষণ দেব যেখানে আমাদের অ্যাক্সেস নেই?\n",
        "\n",
        "ঠিক আছে, উত্তরটি আশ্চর্যজনকভাবে সহজ। আপনি যদি পাইটর্চে কাজ করতে অভ্যস্ত হন তবে আপনি টর্চ(torch) নিয়ে কাজ করতেও অভ্যস্ত! এ জাতীয় টেনসর(Tensor) অব্জেক্ট!"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "Z_lmwPmbj6Tu",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "x = torch.tensor([1,2,3,4,5])\n",
        "y = x + x\n",
        "print(y)"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "gVlsvQ5yj6Ty",
        "colab_type": "text"
      },
      "source": [
        "স্পষ্টতই, এই অসাধারণ অভিনব (এবং শক্তিশালী!) টেনসরগুলি ব্যবহার করা গুরুত্বপূর্ণ, তবে আপনার স্থানীয় মেশিনে ডেটা থাকাও দরকার। এখান থেকেই আমাদের যাত্রা শুরু।\n",
        "\n",
        "# বিভাগ ১.১ - ববের(Bob) মেশিনে টেনসরগুলি প্রেরণ\n",
        "\n",
        "যেখানে সাধারণত আমরা যে মেশিনে ডাটা থাকে সেই মেশিনেই ডাটা সায়েন্স/ডিপ লার্নিং সঞ্চালন করি, এখন আমরা এই ধরনের কম্পিউটেশন **অন্য কোন** মেশিনে  সম্পাদন করতে চাই। আরো নির্দিষ্টভাবে, আমরা আর সহজেই ধরে নিতে পারি না যে ডাটা আমাদের লোকাল মেশিনে রয়েছে।\n",
        "\n",
        "সুতরাং, টর্চ টেনসরগুলি ব্যবহার করার পরিবর্তে আমরা এখন টেনসরের ** পয়েন্টারগুলির **  সাথে কাজ করব। আমি কি বলতে চাচ্ছি তা আপনাকে দেখাতে দিন। প্রথমে আসুন একটি মেশিন তৈরি করি, ধরে নিই মেশিনটি বব(Bob) নামের একজন মানুষের।"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "igUBB-jyj6T0",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "bob = sy.VirtualWorker(hook, id=\"bob\")"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "fcqJYNRqj6T8",
        "colab_type": "text"
      },
      "source": [
        "ধরা যাক ববের যন্ত্রটি অন্য গ্রহে রয়েছে - সম্ভবত মঙ্গলগ্রহে! তবে, এই মুহুর্তে মেশিনটি খালি রয়েছে। আসুন কিছু ডেটা তৈরি করা যাক যাতে আমরা এটি ববকে প্রেরণ করতে পারি এবং পয়েন্টারগুলি সম্পর্কে জানতে পারি!"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "Xb9ccbTSj6T9",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "x = torch.tensor([1,2,3,4,5])\n",
        "y = torch.tensor([1,1,1,1,1])"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "n8t2e5bcj6UC",
        "colab_type": "text"
      },
      "source": [
        "এবং এখন - আসুন আমাদের টেন্সরগুলি Bob-কে প্রেরণ করি!!"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "NaRVGgkgj6UD",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "x_ptr = x.send(bob)\n",
        "y_ptr = y.send(bob)"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "fbiF7oG3j6UJ",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "x_ptr"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "Pl2ZZqjBj6UN",
        "colab_type": "text"
      },
      "source": [
        "বুম!!!! এখন Bob-এর কাছে দু'টি টেন্সর আছে! বিশ্বাস হয় না? নিজে একবার দেখুন!"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "WiOkzApoj6UO",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "bob._objects"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "ZGGNrFgVj6UV",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "z = x_ptr + x_ptr"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "IaWkhOOqj6Ua",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "z"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "3hVJlXX8j6Ue",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "bob._objects"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "68hy0J2Mj6Uh",
        "colab_type": "text"
      },
      "source": [
        "এখন কিছু লক্ষ্য করুন। আমরা যখন `x.send (বব)` কল করি তখন এটি একটি নতুন অব্জেক্ট রিটার্ন করে যাকে আমরা `x_ptr` বলছি। এটি একটি টেন্সরের দিকে আমাদের প্রথম *পয়েন্টার*। টেন্সরগুলিতে পয়েন্টারগুলি আসলে ডেটা রাখে না। এর পরিবর্তে, তারা কেবল অন্য মেশিনে সঞ্চিত টেনসর (ডেটা সহ) সম্পর্কে মেটাডেটা ধারণ করে। এই টেনসরগুলির উদ্দেশ্য হলো এই টেনসরটি ব্যবহার করে অন্য মেশিনকে ফাংশনগুলি গণনা করতে বলার জন্য একটি intuitive API দেওয়া। পয়েন্টারগুলিতে থাকা মেটাডেটাটি একবার দেখে নেওয়া যাক।"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "goMJOpMuj6Ui",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "x_ptr"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "isRuTXCdj6Um",
        "colab_type": "text"
      },
      "source": [
        "মেটাটাটা দেখুন!\n",
        "\n",
        "পয়েন্টারগুলিতে নির্দিষ্ট দুটি প্রধান বৈশিষ্ট্য রয়েছেঃ\n",
        "\n",
        "- `x_ptr.location: bob`, অবস্থান, পয়েন্টারটি যেখানে পয়েন্ট করছে তার অবস্থানের রেফারেন্স\n",
        "- `x_ptr.id_at_location: <random integer>`, টেন্সরটিতে যে অবস্থানে আছে তার একটি আইডি\n",
        "\n",
        "এগুলি `<id_at_location>@<location>' ফর্ম্যাটে মুদ্রিত হয়েছে\n",
        "\n",
        "আরও অন্যান্য জেনেরিক বৈশিষ্ট্য রয়েছেঃ\n",
        "- `x_ptr.id: <random integer>`, আমাদের পয়েন্টার টেন্সরের আইডি, এটি randomly বরাদ্দ করা হয়েছিল\n",
        "- `x_ptr.owner: \"me\"`, যে কর্মী পয়েন্টার টেনসারের মালিক, এখানে স্থানীয় শ্রমিক, নাম দেওয়া হয়েছে \"me\""
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "4fw8uQxjj6Un",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "x_ptr.location"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "LmXYBiTDj6Uu",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "bob"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "I5UD-3lEj6U1",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "bob == x_ptr.location"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "feF8kQ3rj6U5",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "x_ptr.id_at_location"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "b8RL2luAj6U8",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "x_ptr.owner"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "G_uhk74rj6VA",
        "colab_type": "text"
      },
      "source": [
        "আপনি ভাবতে পারেন যে পয়েন্টারের মালিকানাধীন স্থানীয় কর্মী কেন ভার্চুয়াল ওয়ার্কার, যদিও আমরা এটি তৈরি করি নি।\n",
        "মজার ঘটনা, ঠিক যেমন ববের জন্য আমাদের ভার্চুয়াল ওয়ার্কার অবজেক্ট ছিল, (ডিফল্টরূপে) সর্বদা আমাদের জন্যও একটি রয়েছে। যখন আমরা `hook = sy.TorchHook()` কল করি তখন এই কর্মী স্বয়ংক্রিয়ভাবে তৈরি হয় এবং তাই আপনাকে সাধারণত নিজে থেকে তৈরি করতে হয় না।"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "OEmbQHtoj6VD",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "me = sy.local_worker\n",
        "me"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "YHxN3gpmj6VK",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "me == x_ptr.owner"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "JVOwcVDsj6VO",
        "colab_type": "text"
      },
      "source": [
        "পরিশেষে, আমরা যেমন একটি টেনসরে .send () কল করতে পারি, ঠিক তেমনভাবে পয়েন্টারে .get() কল করে তা ফিরিয়েও আনতে পারি।!"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "EW1tkmrVj6VP",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "x_ptr"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "teRM-AnOj6VS",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "x_ptr.get()"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "jIt986gFj6VV",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "y_ptr"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "lPK5Ruo-j6VY",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "y_ptr.get()"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "yaIL0XTDj6Vc",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "z.get()"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "7kd8oAXOj6Ve",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "bob._objects"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "D9mSCs4xj6Vh",
        "colab_type": "text"
      },
      "source": [
        "এবং আপনি দেখতে পাচ্ছেন ... বব এর আর কোন টেনসর নেই! তারা আমাদের মেশিনে ফিরে গেছে!"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "1ZEKJ4oTj6Vi",
        "colab_type": "text"
      },
      "source": [
        "# বিভাগ 1.2 - টেনসর পয়েন্টার ব্যবহার করে\n",
        "\n",
        "সুতরাং, ববের কাছ থেকে টেনসরগুলি প্রেরণ এবং গ্রহণ করা দুর্দান্ত, তবে এটিকে ডিপ লার্নিং না বললেই চলে! আমরা রিমোট টেনসরগুলিতে টেনসর _অপারেশন_ সম্পাদন করতে সক্ষম হতে চাই। ভাগ্যক্রমে, টেনসর পয়েন্টারগুলি এটি বেশ সহজ করে তোলে! আপনি পয়েন্টারগুলো সাধারণ টেনসরগুলোর মতো ব্যবহার করতে পারেন!"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "cQ2t1GNgj6Vj",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "x = torch.tensor([1,2,3,4,5]).send(bob)\n",
        "y = torch.tensor([1,1,1,1,1]).send(bob)"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "S3F9hWhYj6Vm",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "z = x + y"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "i-9algmGj6Vq",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "z"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "qKElKarmj6Vw",
        "colab_type": "text"
      },
      "source": [
        "এবং voilà!\n",
        "\n",
        "পর্দার আড়ালে খুব শক্তিশালী কিছু ঘটেছে। স্থানীয়ভাবে x এবং y সংযোজন করার পরিবর্তে, একটি কমান্ড সিরিয়ালাইজড করা হয়েছিল এবং ববকে পাঠানো হয়েছিল। যে গণনা করেছিলেন, সে একটি সেন্সর z তৈরি করেছিলেন এবং তারপরে পয়েন্টারটি z এ ফিরিয়ে এনেছেন!\n",
        "\n",
        "আমরা যদি পয়েন্টারে .get () কল করি তবে আমরা আমাদের মেশিনে ফলাফলটি ফিরে পাব!"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "cQx_Ojgrj6Vx",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "z.get()"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "TvfDOIGpj6V1",
        "colab_type": "text"
      },
      "source": [
        "### Torch ফাংশনসমূহ\n",
        "\n",
        "এই API, Torch-এর সমস্ত অপারেশনসমূহে প্রসারিত হয়েছে !!!"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "h3nnYmk9j6V1",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "x"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "JsngPIYYj6V4",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "y"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "6qwl2Rr5j6V-",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "z = torch.add(x,y)\n",
        "z"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "QZWoFANvj6WE",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "z.get()"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "LodN7ORzj6WO",
        "colab_type": "text"
      },
      "source": [
        "### ভেরিয়েবল (ব্যাকপ্রোপেশন সহ!)"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "k7S3E1csj6WR",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "x = torch.tensor([1,2,3,4,5.], requires_grad=True).send(bob)\n",
        "y = torch.tensor([1,1,1,1,1.], requires_grad=True).send(bob)"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "9Mp_bsJJj6WV",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "z = (x + y).sum()"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "W9F78qacj6WZ",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "z.backward()"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "RJTBBgQ4j6Wf",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "x = x.get()"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "PfRvTcqZj6Wn",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "x"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "U4cIRy9Oj6Ws",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "x.grad"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "36ZOttsxj6Wx",
        "colab_type": "text"
      },
      "source": [
        "সুতরাং আপনি দেখতে পাচ্ছেন যে, Torch -এ যে সমস্ত কাজ সম্পাদন করা যায়, এই API খুব সহজে দূরবর্তী ডেটাতে সে সমস্ত কাজ সম্পাদন করতে সক্ষম। এটি আমাদের আরও উন্নত গোপনীয়তা সংরক্ষণের প্রোটোকল যেমন - ফেডারেটেড লার্নিং, সিকিওর মাল্টি-পার্টি কমিউটেশন এবং ডিফারেনশিয়াল প্রাইভেসির সংরক্ষণের ভিত্তি তৈরি করে!"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "c1vTfdc3j6Wx",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        ""
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "SnWQJq8kj6W2",
        "colab_type": "text"
      },
      "source": [
        "# অভিনন্দন !!! - সম্প্রদায় যোগদানের সময়!\n",
        "\n",
        "এই নোটবুক টিউটোরিয়ালটি সম্পন্ন করার জন্য অভিনন্দন! আপনি যদি এটি উপভোগ করেন এবং গোপনীয়তা সংরক্ষণ, এআই এবং এআই সরবরাহ চেইনের (ডেটা) বিকেন্দ্রীভূত মালিকানার দিকে আন্দোলনে যোগ দিতে চান, আপনি নিম্নলিখিত উপায়ে এটি করতে পারেন!\n",
        "\n",
        "### গিটহাবে PySyft-কে স্টার দিন\n",
        "\n",
        "আমাদের সম্প্রদায়কে সাহায্য করার সবচেয়ে সহজ উপায় হ'ল কেবল গিটহাব রেপো অভিনীত! এটি আমরা যে শীতল সরঞ্জামগুলি তৈরি করছি তার সচেতনতা বাড়াতে সহায়তা করে।\n",
        "\n",
        "- [স্টার পাইসাইফ্ট](https://github.com/OpenMined/PySyft)\n",
        "\n",
        "### আমাদের স্ল্যাচে যোগ দিন!\n",
        "\n",
        "সর্বশেষতম অগ্রগতিতে আপ টু ডেট রাখার সর্বোত্তম উপায় হলো আমাদের সম্প্রদায়ে যোগদান করা! আপনি [http://slack.openmined.org](http://slack.openmined.org) এ ফর্মটি পূরণ করে এটি করতে পারেন\n",
        "\n",
        "### একটি কোড প্রকল্পে যোগদান করুন!\n",
        "\n",
        "আমাদের সম্প্রদায়ে অবদান রাখার সর্বোত্তম উপায় হ'ল কোড অবদানকারী হয়ে উঠুন! যে কোনও সময় আপনি পাইসাইফ্ট গিটহাব ইস্যু পৃষ্ঠাতে যেতে পারেন এবং \"প্রকল্পগুলি\" এর জন্য ফিল্টার করতে পারেন। এটি আপনাকে শীর্ষ স্তরের সমস্ত টিকিট দেখিয়ে দেবে যে আপনি কোন প্রকল্পগুলিতে যোগদান করতে পারেন তার একটি ওভারভিউ দেয়! আপনি যদি কোনও প্রকল্পে যোগ দিতে না চান তবে আপনি কিছুটা কোডিং করতে চান, আপনি আরও ভাল \"ওয়ান অফ\" মিনি-প্রকল্পগুলি গিটহাব ইস্যুগুলি \"ভাল প্রথম ইস্যু\" চিহ্নিত করে অনুসন্ধান করতে পারেন।\n",
        "\n",
        "- [PySyft Projects](https://github.com/OpenMined/PySyft/issues?q=is%3Aopen+is%3Aissue+label%3AProject)\n",
        "- [Good First Issue Tickets](https://github.com/OpenMined/PySyft/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22)\n",
        "\n",
        "### দান করুন\n",
        "\n",
        "আপনার যদি আমাদের কোডবেসে অবদান রাখার সময় না থাকে তবে তবুও সমর্থন leণ দিতে চান, আপনি আমাদের ওপেন কালেক্টিভেরও ব্যাকের হয়ে উঠতে পারেন। সমস্ত অনুদান আমাদের ওয়েব হোস্টিং এবং অন্যান্য সম্প্রদায় ব্যয় যেমন হ্যাকাথনস এবং মেটআপগুলির দিকে যায়!\n",
        "\n",
        "[OpenMined's Open Collective Page](https://opencollective.com/openmined)"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "eiq_K83Uj6W3",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        ""
      ],
      "execution_count": 0,
      "outputs": []
    }
  ]
}